/******************************************************************
文件名	：lcd.c
功能 	：lcd.c对应的头文件
版本	：1.0
时间	：2017.10.19
作者	：王理洁
联系方式：wanglijie201710@163.com
******************************************************************/
#ifndef _SHOW_PICTURE_H_
#define _SHOW_PICTURE_H_

#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>  
#include <linux/input.h>
#include <stdarg.h>  // ANSI C 可变参数函数头文件

#include "font.h"



/*************颜色***********************/
#define WHITE 	0x00ffffff			//白色
#define BLACK 	0x00000000			//黑色
#define RED		0x00ff0000			//红色
#define GREEN	0x0000ff00			//绿色
#define BLUE	0x000000ff			//蓝色
#define YELLOW	0x00ffff00			//黄色
#define ORANGE	0x00ffc000			//橙色
#define PURPLE	0x007030a0			//紫色
#define NONE	0xffffffff			//用于字体无前景色，详情请看draw_text函数的注释





typedef unsigned short U16;
typedef unsigned int   U32;

struct touch_screen_data{
	int x;		//x坐标
	int y;		//y坐标
};

struct cross_screen_data{
	int x1;
	int y1;
	int x2;
	int y2;
	int delta_x;
	int delta_y;
};

typedef struct 
{
	
	char 			type;				//字体			----传入ASCII码 ‘s’ ‘k’ ‘h’ ‘w’ 分别对应 仿宋，楷体，黑体，微软雅黑 
	unsigned char 	size;				//字号			----支持6个字号：16 24 32 40 48 56，16号既为16*16个像素点
	char * 			character;			//要打印的字串	----可以是英文或中文
	unsigned short  x;					//起始位置的X坐标
	unsigned short 	y;					//起始位置的Y坐标	
	unsigned int 	color_character;	//字体颜色		----传入 32bit ARGB 颜色值
	unsigned int 	color_background;	//字体背景颜色	----值为0xFFFFFFFF时背景为透明，不覆盖原来的内容
}lcd_text;

typedef struct 
{
	unsigned short 	x0;					//块左上角x坐标
	unsigned short 	y0;					//块左上角y坐标
	unsigned short 	width;				//块宽度
	unsigned short 	height;				//块高度
	unsigned int 	color;				//填充色
}lcd_block;


typedef struct 
{
	unsigned short 	x0;					//方框左上角x坐标
	unsigned short 	y0;					//方框左上角y坐标
	unsigned short 	width;				//方框宽度
	unsigned short 	height;				//方框高度
	unsigned short 	line_width;			//线宽
	unsigned int 	line_color;			//线色
	unsigned int 	fill_color;			//填充色
}lcd_box;

typedef struct 
{
	char 			text_flag;			//如果有字此标志位应该置1，否则应置0
	int				reverse_color;		//item的反显颜色
	lcd_block		block;				//item的块
	lcd_block		line;				//item的线
	lcd_text		text;				//item要显示的字
}lcd_item;


typedef struct 
{
	char 			text_flag;			//如果有字此标志位应该置1，否则应置0
	int				reverse_color;		//button的反显颜色
	lcd_box			box;				//button的方框
	lcd_text		text;				//button要显示的字
}lcd_button;





typedef struct tagBMPHEADER
{
	U16 bfType;			//2 byte 说明文件类型（内容为BM）
	U32 bfSize;			//4 byte 文件大小，单位:byte
	U16 bfReserved1;	//2 byte 保留
	U16 bfReserved2;	//2 byte 保留
	U32 bfOffBits;		//4 byte 从文件头到图象数据的偏移量
}__attribute__((packed)) BMPHEADER;



typedef struct tagMAPHEADER
{
	U32 biSize;			//4 byte mapheader结构体所需字节数
	U32 biWidth;		//4 byte 图像宽度，单位:像素
	U32 biHeight;		//4 byte 图像高度，单位:像素
	U16 biPlanes;		//2 byte 平面数
	U16 biBitCount;		//2 byte 说明 bit/像素 其值为：1，4，8，16，24，32
	U32 biCompression;	//4 byte 压缩类型
	U32 biSizeImage;	//4 byte 图像大小，单位：byte
	U32 biXPelsPerMeter;//4 byte 水平分辨率
	U32 biYPelsPerMeter;//4 byte 垂直分辨率
	U32 biClrUsed;		//
	U32 biClrImportant;
}__attribute__((packed)) MAPHEADER;



extern unsigned int *fd_mem;
extern unsigned int virtual_lcd[480][800];



struct touch_screen_data touch_screen(void);
struct cross_screen_data cross_screen(void);

/*  draw开头的函数先反对象画到虚拟显存（其实就是一个数组），并不马上显示出来，调用show_lcd_now();之后才会显示出来*/
int draw_block(lcd_block * block);
int draw_box(lcd_box * box)	;
int draw_text(lcd_text * text );
int draw_button(lcd_button * button);
int draw_bmp(int x,int y,const char *filename);

int show_lcd_now(void);

int press_button(int num_of_button,...);


#endif